﻿using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.DependencyInjection;
using ProductDemo;
using System;

namespace ProductDemo
{
    public static class CapExtensions
    {

        public  static IServiceCollection AddCap(this IServiceCollection services, string connectionString)
        {
            // 8、添加事件总线cap
            services.AddCap(x => {
                // 8.1 使用内存存储消息(消息发送失败处理)
                // x.UseInMemoryStorage();
                // 8.1 使用EntityFramework进行存储操作
                x.UseEntityFramework<AggregateContext>();
                // 8.2 使用sqlserver进行事务处理，防止推送MQ失败，会在指定数据库中自动生成以"cap."开头的表
                x.UseSqlServer(connectionString);
                x.FailedThresholdCallback = failedInfo =>
                {
                    Console.WriteLine(failedInfo.Message.Value);
                };

                // 8.3 使用RabbitMQ进行事件中心处理
                x.UseRabbitMQ(rb => {
                    rb.HostName = "localhost";
                    rb.UserName = "guest";
                    rb.Password = "guest";
                    rb.Port = 5672;
                    rb.VirtualHost = "/";
                });
                // 8.4添加cap后台监控页面(人工处理)；页面地址为“/cap”；如：http://www.site.com/cap
                x.UseDashboard();
                // 8.5配置定时器重试策略
                //x.FailedRetryInterval = 2; //重试间隔时间（秒），使用默认的就可以，可不用配置
                x.FailedRetryCount = 5; //重试次数
                x.ProducerThreadCount = 1;
            });

            // 9、注册上下文到IOC容器
            services.AddDbContext<AggregateContext>(options =>
            {
                options.UseSqlServer(connectionString);
            });

            return services;
        }
    }
}
